package br.edu.ufcg.nokia.battleship.tests;

import junit.framework.TestCase;
import br.edu.ufcg.nokia.battleship.Navio;
import br.edu.ufcg.nokia.battleship.Tabuleiro;
import br.edu.ufcg.nokia.battleship.excecoes.LimiteTabuleiroExcedidoException;
import br.edu.ufcg.nokia.battleship.excecoes.NavioSobrepostoException;

/**
 * Classe de teste da classe Tabuleiro.
 * @author Miguel Queiroga, Jackson Azevedo, Edmilson Almeida, Jose Luis
 * @version 1.0
 */

public class TestTabuleiro extends TestCase {

	private Tabuleiro tab1 = new Tabuleiro();

	/**
	 * Construtor para a classe de teste do tabuleiro
	 * @param arg
	 */

	public TestTabuleiro(String arg) {
		super(arg);
	}

	/**
	 * Verifica a funcionalidade dos metodos getConteudo e
	 * setConteudo do tabuleiro. 
	 */

	public void testGetConteudo_SetConteudo(){
		tab1.setConteudo(1,1,Tabuleiro.AGUA_MORTA);
		tab1.setConteudo(1,2,Navio.ENCOURACADO);
		tab1.setConteudo(2,1,Tabuleiro.AGUA);
		tab1.setConteudo(2,2,Navio.DESTROIER);
		tab1.setConteudo(10,10,Navio.SUBMARINO);
		assertEquals(Tabuleiro.AGUA_MORTA, tab1.getConteudo(1,1));
		assertEquals(Navio.ENCOURACADO, tab1.getConteudo(1,2));
		assertEquals(Tabuleiro.AGUA, tab1.getConteudo(2,1));
		assertEquals(Navio.DESTROIER, tab1.getConteudo(2,2));
		assertEquals(Navio.SUBMARINO, tab1.getConteudo(10,10));
	}
	
	/**
	 * Verifica funcionalidade do metodo reinicia
	 */

	public void testReinicia(){
		tab1.reinicia();
		int tabuleiro[][] = tab1.getTabuleiro();
		for(int i = 0; i < Tabuleiro.LIMITE_TABULEIRO; i++){
			for(int j = 0; j < Tabuleiro.LIMITE_TABULEIRO; j++){
				assertEquals(Tabuleiro.AGUA, tabuleiro[i][j]);
			}
		}
	}
	
	/**
	 * Verifica funcionalidade do metodo getTabuleiro
	 */

	public void testGetTabuleiro(){
		testReinicia(); 
	}
	
	/**
	 * Verifica funcionalidade do metodo adicionaNavio. 
	 */

	public void testAdicionaNavio(){
		tab1.reinicia();
		try{
			tab1.adicionaNavio(1,1,true,Navio.FRAGATA);
			assertEquals(Navio.FRAGATA, tab1.getConteudo(1, 1));
			assertEquals(Navio.FRAGATA, tab1.getConteudo(2, 1));
			
			tab1.adicionaNavio(8, 4, false, Navio.DESTROIER);
			assertEquals(Navio.DESTROIER, tab1.getConteudo(8, 4));
			assertEquals(Navio.DESTROIER, tab1.getConteudo(8, 5));
			assertEquals(Navio.DESTROIER, tab1.getConteudo(8, 6));
		}catch (LimiteTabuleiroExcedidoException limite){	//Certeza de nao ocorrer essas excecoes
		}catch (NavioSobrepostoException navio){}

		try{
			tab1.adicionaNavio(6,9,false,Navio.SUBMARINO);
			fail("Nao pode adicionar o submarino, ultrapassou o limite do tabuleiro");
		}catch (LimiteTabuleiroExcedidoException sucesso){
			assertTrue(sucesso.getMessage().indexOf("Limite") >= 0);
		}catch (NavioSobrepostoException sucesso){}
		
		try{
			tab1.adicionaNavio(1,1,true,Navio.PORTA_AVIOES);
			fail("Nao pode adicionar o porta-avioes sobre a fragata");
		}catch (NavioSobrepostoException sucesso){
			assertTrue(sucesso.getMessage().indexOf("casa") >= 0);
		}catch (LimiteTabuleiroExcedidoException sucesso){	//Nao ocorrera essa excecao
		}
		
		try{
			tab1.adicionaNavio(9,6,true,Navio.SUBMARINO);
			fail("Nao pode adicionar o submarino fora dos limites do tabuleiro");
		}catch (NavioSobrepostoException sucesso){			//Nao ocorrera essa excecao
		}catch (LimiteTabuleiroExcedidoException sucesso){
			assertTrue(sucesso.getMessage().indexOf("Limite") >= 0);
		}
	}
}